package com.lhkk.inventoryvehicle.led

import CRC16Util
import java.nio.charset.Charset

object CMD {
    const val DA = "00"
    const val VR = "64"
    const val PN = "FFFF"
    const val CMD = "6F"
    const val DL = "" //数据长度，需要计算
    const val SF = "00" //SF:取值为 0 时表示下载到临时区，取值为 1 时表示下载到存储区，频繁修改的内容建议下载到临时区。
    const val GST =
        "FF" //GST: 界面显示时间，单位为秒。取值为 0~5 时表示使用模板默认值，取值为 254~255表示一直显示当前界面，取值 6~253 表示用户自定义的显示时间。
    const val TEXT_CONTEXT_NUMBER = "01" //为文本参数数量，即几行文本。目前版本最大支持 4 行。
    const val LID = "00" //LID:为显示行号。0 表示第 1 行，1 表示第 2 行，以此类推。
    const val DM = "15" //为显示模式0x15为连续左移
    const val DS = "00" //DS:为显示速度，建议取值为 0；
    const val DT = "FF" //DT:停留时间，单位为秒，最大为 255 秒；
    const val DR = "00" //DR：为显示次数，0 为无限循环显示。
    const val FINDEX = "03" //FINDEX:为字体索引。注意:每种主板支持字体不一样
    const val FLAGS = "00" //FLAGS:显示标志位,目前没有用到，作为保留值，固定取值为 0X00
    const val TC_RED =
        "FF000000" //TC：为文本颜色，32 位数据类型，存储结构为 RGBA，R 为红色分量，G 为绿色分量，B 为蓝色分量，A 为透明值目前保留为 0，没个颜色分量占用一个字节即 8 位。
    const val TC_GREEN = "00DD0000"
    const val TL = "" //文本长度，需要计算
    const val TEXT = "" //文本内容需要动态生成
    const val VF = "0A" //语音标识
    const val VTL = "" //语音文本长度,需要计算
    const val VOICE = "" //语音文本内容
    const val TEXT_END = "00" //文本结束标志
    const val CRC16 = "" //校验码
    val TEXT_COMMON_CMD = "$SF$GST$TEXT_CONTEXT_NUMBER$LID$DM$DS$DT$DR$FINDEX$FLAGS"
    const val COMMON_CMD = "$DA$VR$PN$CMD"

    /**
     * 获取通行指令
     * @param text 显示文本
     * @param voice 语音文本
     * @param tc 显示颜色(16进制字符串)
     */
    fun getCmd(text: String, voice: String, tc: String): String {
        val textContentHexString =
            TextToHexConverter.stringToHexString(text, Charset.forName("GBK"))
        val voiceContentHexString =
            TextToHexConverter.stringToHexString(voice, Charset.forName("GBK"))
        val tl = textContentHexString.length / 2
        val vl = voiceContentHexString.length / 2
        val tl16 = TextToHexConverter.intToTwoDigitHexString(tl)
        val vl16 = TextToHexConverter.intToTwoDigitHexString(vl)
        val textCmd =
            "$TEXT_COMMON_CMD$tc$tl16$textContentHexString$TEXT_END$VF$vl16$voiceContentHexString$TEXT_END"
        val dl = textCmd.length / 2
        val dl16 = TextToHexConverter.intToTwoDigitHexString(dl)
        val cmd = "$COMMON_CMD$dl16$textCmd"
        val crc16 = CRC16Util.calculateCRC16(cmd)
        return "$cmd$crc16"
    }
}